代码 > 魔改了v8go,实现了long live引擎
2026-01-12
https://github.com/rogchap/v8go
最后是搞定了FinalizationRegistry释放go里的资源了。
首先一同魔改,
auto default_platform = platform::NewDefaultPlatform(0,v8::platform::IdleTaskSupport::kEnabled);
创建platform时加入idletask支持。
然后把PumpMessageLoop和RunIdleTasks extend给go。
通过写了多个snapshot在chrome里分析,具体的gc过程是这样的。
首先,Context Release变量,这时候,变量本身会释放
然后PumpMessageLoop,这时候,变量会从FinalizationRegistry里消失
然后再PumpMessageLoop return true时RunIdleTasks一下,这时候held value会从FinalizationRegistry里消失
这时候要再执行一次RunIdleTasks,才会制定回调。
也就是一次释放,要至少经过3次空闲。
这个问题终于被我搞定了,我都会觉得自己是v8小能手了
点击登录